//!
/**
 ***********************************************************************************************************
 * <RBPlane Implementation>
 ***********************************************************************************************************
 * @file RBPlane.cpp
 ***********************************************************************************************************/

/***********************************************************************************************************
 * Precompiled Header
 ***********************************************************************************************************/
#include "RBMainPCH.h"

/***********************************************************************************************************
 * Includes
 ***********************************************************************************************************/
#include "RBPlane.h"

/***********************************************************************************************************
 * Defines
 ***********************************************************************************************************/

/***********************************************************************************************************
 * Classes implementation
 ***********************************************************************************************************/

/**
 ***********************************************************************************************************
 * Constructor
 ***********************************************************************************************************/
RBPlane::RBPlane()
{
}

/**
 ***********************************************************************************************************
 * Destructor
 ***********************************************************************************************************/
RBPlane::~RBPlane()
{
}

/**************************************************************************************************************************************************************
 * 
 **************************************************************************************************************************************************************/
RBPlane::Side RBPlane::WhichSide(const float3& point) const
{
    float32 fDistFromPlane = GetDistance(point);
    if (fDistFromPlane < 0.0f)
    {
        return PS_NEGATIVE;
    }
    else if (fDistFromPlane > 0.0f)
    {
        return PS_POSITIVE;
    }
    else 
    {
        return PS_NOSIDE;
    }
}

/**************************************************************************************************************************************************************
 * 
 **************************************************************************************************************************************************************/
float32 RBPlane::GetDistance(const float3& point) const
{
    return point.Dot(Normal) + Distance;
}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
void RBPlane::Build( float3 normal, float3 point )
{
    Normal = normal.Normalize();
    Distance = -normal.Dot(point);
}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
float3 RBPlane::GetIntersection( float3 point )
{
    return point - GetDistance(point) * Normal;
}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
void RBPlane::Normalize( RBPlane* plane )
{
    float invLength = 1.f / plane->Normal.GetLength();
    plane->Normal *= invLength;
    plane->Distance *= invLength;
}

/***********************************************************************************************************/
